package com.essg.sdc.study;

import com.essg.sdc.base.BaseAlgo;

/**
 * <H1>新人社員向けアルゴリズム(Java)</H1>
 *<H2>アルゴリズム（コントロールブレーク）</H2><br>
 *<ol>
 *	<li>社員情報(EmpData)を自動生成
 *	<li>部署コードでコントロールブレークを行い情報の一覧表示を行う。
 *</ol>
 *
 * @author ess0034
 */
public class ControlBreak extends BaseAlgo{


	/**
	 * コントロールブレーク　セーブキー
	 */
	private EmpData mSvEmp;
	/**
	 * コントロールブレーク　トランキー
	 */
	private EmpData mTrEmp;
	/**
	 * 部署印刷フラグ
	 */
	private boolean mHeader;

	/**
	 * <H2>コントロールブレーク　コンストラクタ</H2>
	 * <ol>
	 * 	<li>Superクラスを実行し社員情報を作成する。
	 * </ol>
	 */
	public ControlBreak(){
		super(ALGO_TYPE.CONTROLBREAK);
	}

	/**
	 * <H2>社員情報一覧表示</H2>
	 * 部署コードにてコントロールブレークを行いながら社員情報を一覧表示する。
	 */
	@Override
	public void ListAlgo(){

		mSvEmp = new EmpData();
		mTrEmp = nextEmp();
		mHeader = false;

		while(!mTrEmp.getDivcd().equals(HIGH_VALUE)){
			while(mSvEmp.getDivcd().equals(mTrEmp.getDivcd())){
				printDetail();
				mTrEmp = nextEmp();
			}
			printDivision();
			mSvEmp.setDivcd(mTrEmp.getDivcd());
		}

	}

	/**
	 * <H2>部署情報表示</H2>
	 * 部署コードがブレークした場合に実行される。<br>
	 * 部署情報を表示する。
	 */
	private void printDivision(){
		if(mTrEmp.getDivcd().equals(HIGH_VALUE)) return;

		System.out.println("Div Sec Esscd   Name            Pay");
		System.out.print(mTrEmp.getDivcd() + " ");
		mHeader = true;
	}

	/**
	 * <H2>社員情報表示</H2>
	 * 社員情報を表示する。<br>
	 * 部署が表示された場合は、続けて表示<br>
	 * 上記以外の場合は、空白で位置合わせを行い表示する、
	 *
	 */
	private void printDetail(){

		String _detail;

		if(mHeader){
			_detail = mTrEmp.getSeccd() + "  " + mTrEmp.getEsscd() + " " + mTrEmp.getName() + String.format(" \\%1$0,3d", mTrEmp.getPay());
			mHeader = false;
		}else{
			_detail = "    " + mTrEmp.getSeccd() + "  " + mTrEmp.getEsscd() + " " + mTrEmp.getName() + String.format(" \\%1$0,3d", mTrEmp.getPay());
		}
		System.out.println(_detail);
	}

	/**
	 * ControlBreakの実行メイン
	 * @param args 実行パラメタ（今回は未使用）
	 * ControlBreakをインスタンス化し、ListAlgo(社員情報一覧表示)を実行
	 */
	public static void main(String[] args) {

		ControlBreak _obj = new ControlBreak();
		_obj.ListAlgo();

	}
}
